package main

import (
	"fmt"
	"log"
	"time"
	"wgmat/pkg/api"
	"wgmat/pkg/core"
)

func main() {
	fmt.Println("=== WebGPU 矩阵加法测试（守护协程版）===")

	// ✅ 使用默认配置（守护协程自动运行）
	ctx, err := core.NewContext(core.WithValidation(true))
	if err != nil {
		log.Fatalf("初始化失败: %v", err)
	}
	defer ctx.Close()

	dataA := []float32{1, 2, 3, 4, 5, 6}
	dataB := []float32{1, 1, 1, 1, 1, 1}

	matA, err := api.NewMatrix(ctx, dataA, 2, 3)
	if err != nil {
		log.Fatalf("创建矩阵A失败: %v", err)
	}
	defer matA.Release()

	matB, err := api.NewMatrix(ctx, dataB, 2, 3)
	if err != nil {
		log.Fatalf("创建矩阵B失败: %v", err)
	}
	defer matB.Release()

	cmd, matC, err := matA.Add(matB)
	if err != nil {
		log.Fatalf("矩阵加法失败: %v", err)
	}
	defer matC.Release()

	executor := core.NewExecutor(ctx)
	if err := executor.Execute(cmd); err != nil {
		log.Fatalf("执行失败: %v", err)
	}

	// ✅ 删除所有轮询逻辑，守护协程自动驱动回调
	resultCh := make(chan struct {
		data []float32
		err  error
	}, 1)

	matC.FetchAsync(func(data []float32, err error) {
		resultCh <- struct {
			data []float32
			err  error
		}{data, err}
	})

	// ✅ 简单阻塞等待（无需Poll）
	timeout := time.After(5 * time.Second)
	select {
	case r := <-resultCh:
		if r.err != nil {
			log.Fatalf("获取结果失败: %v", r.err)
		}
		fmt.Println("\n=== 最终结果 ===")
		fmt.Printf("Result: %v\n", r.data)
	case <-timeout:
		log.Fatal("操作超时（5秒）")
	}
}
